package com.yunlin.protocal;
/*
    ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 
       Author   :  lixiaodaoaaa
       Date     :  2018/6/7
       Time     :  23:29
    ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
    基于BTE设备的 协议工具类  用于生成特定的指令集
 */


import com.yunlin.utils.ConvertUtils;
import com.yunlin.utils.FormatUtils;

import java.util.Calendar;

public class BteProtocalUtils{
    
    
    /**
     * --------------*****     【根据协议规定】  *****---------------
     * 为了发送指令，bluetooth中的mac地址要反转一下才能组装成命令发出去
     * <p>
     * 举例mac为： cb73b304391f
     * 需要反转为：
     *
     * @return
     */
    public static String reverseMacAddress(String macAddress){
        return FormatUtils.revert6String(macAddress);
    }
    
    
    public static Long getTimeStamps(){
        return Calendar.getInstance().getTimeInMillis() / 1000;
    }
    
    
    /*
     * 得到握手的时间指令
     * 根据协议的规定
     * 需要反转
     */
    public static String getHandShakeTimeCommand(){
        String currentTimeHexValueStr=FormatUtils.longValueTo8Hex(getTimeStamps());
        return FormatUtils.revert4String(currentTimeHexValueStr);
    }
    
    
    /**
     * 得到mac地址 的求加和低位字节String
     *
     * @return
     */
    public static String getMacAddressAddCheckLowByteHex(String macAddress){
        return getAddCheckResult(macAddress);
    }
    
    /**
     * 得到开锁密码的指令形式
     *
     * @param pwd
     * @return
     */
    public static String getOpenLockPwdCommand(String pwd){
        char[] pwdChars=pwd.toCharArray();
        String result="";
        
        for (char tempChar : pwdChars) {
            result+=FormatUtils.intValueTo2HexString(Integer.valueOf(tempChar));
        }
        return result;
    }
    
    public static String getOpenLockPwdOther(String pwd){
        String result="";
        for (int i=0; i < pwd.length(); i++) {
            String tempStr=pwd.substring(i, i + 1);
            result+=FormatUtils.intValueTo2HexString(Integer.valueOf(tempStr));
        }
        return result;
    }
    
    
    /**
     * 得到mac地址 的求加和低位字节String
     *
     * @return
     */
    public static int getMacAddressAddCheckLowByteInt(String macAddress){
        return FormatUtils.hexString2IntValue(getMacAddressAddCheckLowByteHex(macAddress));
    }
    
    
    /**
     * 得到mac地址 的求加和低位字节的字节类型
     *
     * @return
     */
    public static byte getMacAddressAddCheckLowByteByte(String macAddress){
        return ConvertUtils.int2OneByte(FormatUtils.hexString2IntValue(getMacAddressAddCheckLowByteHex(macAddress)));
    }
    
    public static String getMacAddressLowByteByMacAddress(String macAddress){
        if (macAddress.length() < 2) {
            return "";
        }
        String checkAddress=macAddress.replace(" ", "").replace(":", "").trim();
        return checkAddress.substring(checkAddress.length() - 2, checkAddress.length());
    }
    
    public static boolean getMacAddressLowByteIsOddNumber(String macAddress){
        String checkAddress=getMacAddressLowByteByMacAddress(macAddress);
        if (FormatUtils.hexString2IntValue(checkAddress) % 2 == 1) {
            
            int value=FormatUtils.hexString2IntValue(checkAddress);
            
            return true;
        }else {
            return false;
        }
    }
    
    
    /**
     * 得到逐位异或的计算结果
     *
     * @param datas
     * @return
     */
    public static byte getXor(byte[] datas){
        byte temp=datas[0];
        for (int i=1; i < datas.length; i++) {
            temp^=datas[i];
        }
        return temp;
    }
    
    //求加和 取低字节一个位字节数
    public static String getAddCheckResult(String checkData){
        if (checkData == null || checkData.equals("")) {
            return "";
        }
        int result=0;
        for (int i=0; i < checkData.length(); i+=2) {
            result+=Integer.parseInt(checkData.substring(i, i + 2), 16);
        }
        return FormatUtils.intValueTo4HexString(result).substring(2, 4);
    }
    
    
    /**
     * 通过functionData 得到需要加密的command返回出来（需要构造成16个字节）
     *
     * @param functionData function data 表示功能位 以及功能位数据
     * @return
     */
    public static String getNeedEncodeCommand(String functionData){
        int totalByteLength=16;
        int functionDataLength=functionData.length() / 2;
        int fixEmptyDataLength=totalByteLength - functionDataLength;
        return functionData + getEmptyDataByNeedEmpyLenght(fixEmptyDataLength);
    }
    
    private static String getEmptyDataByNeedEmpyLenght(int emptyLenght){
        String emptyData="";
        if (emptyLenght > 0) {
            for (int i=0; i < emptyLenght; i++) {
                emptyData+="00";
            }
        }
        
        return emptyData;
    }
    
    
}
